#pragma once

#include <string>
#include <memory>

#include "ws_msg_dispatcher.hpp"
#include "api/p2pms_common.hpp"
#include "p2pms_util.hpp"
#include "api/media_stream_interface.h"

namespace p2pms
{

enum class CallRole
{
	Undefined, // 未定义角色
	Caller,    // 发起呼叫者
	Callee     // 被呼叫者
};

//==================================================================================================
//
//==================================================================================================
class ICallHandler
{
public:
	virtual ~ICallHandler() = default;

	// 呼叫状态改变通知
	virtual void OnCallStateChanged(std::string call_id, CallState state) = 0;
	// 开始发布媒体通知
	virtual void OnStartPublish(const std::string& user_id, const MediaInfo& media) = 0;
	// 停止发布媒体通知
	virtual void OnStopPublish(const std::string& user_id, const MediaInfo& media) = 0;
	// 本端发布媒体结果
	virtual void OnStartPublishResult(const MediaInfo& media, bool result) = 0;
	// 本端停止发布媒体结果
	virtual void OnStopPublishResult(const MediaInfo& media, bool result) = 0;
	// 开始订阅媒体结果
	virtual void OnStartSubscribeResult(const std::string& user_id, const MediaInfo& media, 
		bool result) = 0;
	// 停止订阅媒体结果
	virtual void OnStopSubscribeResult(const std::string& user_id, const MediaInfo& media, 
		bool result) = 0;
	// 远端添加媒体轨道通知
	virtual void OnAddTrack(const std::string& user_id, const MediaInfo& media,
		rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> track) = 0;
	// 远端移除媒体轨道通知
	virtual void OnRemoveTrack(const std::string& user_id, const MediaInfo& media) = 0;
};

//==================================================================================================
//
//==================================================================================================
class ICallAgent : public std::enable_shared_from_this<ICallAgent>
{
public:
	virtual ~ICallAgent() = default;

	// 初始化
	virtual ErrCode Init() = 0;
	
	// 开始呼叫
	virtual ErrCode MakeCall(const std::string& callee_id) = 0;
	// 接受呼叫
	virtual ErrCode IncomingCall(const CallMakeNotifyData& notify_data) = 0;
	// 停止呼叫
	virtual void TerminateCall() = 0;

	// 开始发布媒体
	virtual ErrCode StartPublish(const MediaInfo& media) = 0;
	// 停止发布媒体
	virtual ErrCode StopPublish(const MediaInfo& media) = 0;
	// 开始订阅媒体
	virtual ErrCode StartSubscribe(const std::string& user_id, const MediaInfo& media) = 0;
	// 停止订阅媒体
	virtual ErrCode StopSubscribe(const std::string& user_id, const MediaInfo& media) = 0;

	// 获取呼叫类型
	virtual CallMode GetCallMode() = 0;
	// 获取呼叫状态
	virtual CallState GetCallState() = 0;
	// 获取主叫用户ID
	virtual std::string GetCallerId() = 0;
	// 获取被叫用户ID
	virtual std::string GetCalleeId() = 0;
	// 获取当前呼叫ID
	virtual std::string GetCallId() = 0;
	// 获取对端用户ID
	virtual std::string GetPeerUserId() = 0;
	// 获取当前用户ID
	virtual std::string GetUserId() = 0;

	// 定时器回调接口
	virtual void OnTimer() = 0;
};

} // namespace p2pms